﻿using Li.DingTalk.Helper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Li.DingTalk.Model.Contacts
{
    /// <summary>
    /// 人员信息获取处理类
    /// </summary>
    public class userHD
    { 

        public static user geuser(string access_token, string code)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/getuserinfo?access_token={0}&code={1}", access_token, code);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<user>(resultJson);
        }

        /// <summary>
        /// 获取成员详情
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="userid"></param>
        /// <param name="lang"></param>
        /// <returns></returns>
        public static userInfo GetUserInfo(string access_token,string userid,string lang= "zh_CN")
        {
            var path = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}&lang={2}", access_token, userid, lang);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<userInfo>(resultJson);
        }

        /// <summary>
        /// 创建成员
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="cms">创建成员信息的结构体</param>
        /// <returns></returns>
        public static createmember Createmember(string access_token, creatememberstructural cms)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/create?access_token={0}", access_token);  
            var StrJson = Newtonsoft.Json.JsonConvert.SerializeObject(cms);
            var create = RequestHelper.Post(path, StrJson);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<createmember>(create);
        }

        /// <summary>
        /// 更新成员
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="ums">更新成员信息的结构体</param>
        /// <returns></returns>
        public static ResultPackage Updatemember(string access_token, updatememberstructural ums)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/update?access_token={0}", access_token);
            var StrJson = Newtonsoft.Json.JsonConvert.SerializeObject(ums);
            var update = RequestHelper.Post(path, StrJson);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<ResultPackage>(update);
        }

        /// <summary>
        /// 删除成员
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="userid"></param>
        /// <returns></returns>
        public static ResultPackage Deletemember(string access_token, string userid)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/delete?access_token={0}&userid={1}", access_token, userid);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<ResultPackage>(resultJson);
        }

        /// <summary>
        /// 批量删除成员
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="bds">批量删除成员信息的结构体</param>
        /// <returns></returns>
        public static ResultPackage batchdeletion(string access_token, batchdeletionstructural bds)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/batchdelete?access_token={0}", access_token);
            var StrJson = Newtonsoft.Json.JsonConvert.SerializeObject(bds);
            var batchdelete = RequestHelper.Post(path, StrJson);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<ResultPackage>(batchdelete);
        }

        /// <summary>
        /// 获取部门成员
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="department_id"></param>
        /// <param name="lang">通讯录语言(默认zh_CN另外支持en_US)</param>
        /// <param name="offset">支持分页查询，与size参数同时设置时才生效，此参数代表偏移量</param>
        /// <param name="size">	支持分页查询，与offset参数同时设置时才生效，此参数代表分页大小，最大100</param>
        /// <param name="order">支持分页查询，部门成员的排序规则，默认不传是按自定义排序；entry_asc代表按照进入部门的时间升序，entry_desc代表按照进入部门的时间降序，modify_asc代表按照部门信息修改时间升序，modify_desc代表按照部门信息修改时间降序，custom代表用户定义(未定义时按照拼音)排序</param>
        /// <returns></returns>
        public static departmentmember Getdepartmentmember(string access_token, long department_id, string lang = "zh_CN", long offset = 0, int size = 1, string order = "entry_asc")
        {
            var path = string.Format("https://oapi.dingtalk.com/user/simplelist?access_token={0}&department_id={1}&lang={2}&offset={3}&size={4}&order={5}", access_token, department_id, lang, offset, size, order);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<departmentmember>(resultJson);
        }

        /// <summary>
        /// 获取部门成员（详情）
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="lang">通讯录语言(默认zh_CN另外支持en_US)</param>
        /// <param name="department_id"></param>
        /// <param name="offset">支持分页查询，与size参数同时设置时才生效，此参数代表偏移量</param>
        /// <param name="size">	支持分页查询，与offset参数同时设置时才生效，此参数代表分页大小，最大100</param>
        /// <param name="order">支持分页查询，部门成员的排序规则，默认不传是按自定义排序；entry_asc代表按照进入部门的时间升序，entry_desc代表按照进入部门的时间降序，modify_asc代表按照部门信息修改时间升序，modify_desc代表按照部门信息修改时间降序，custom代表用户定义(未定义时按照拼音)排序</param>
        /// <returns></returns>
        public static departmentmemberlists Getdepartmentmemberlist(string access_token, long department_id, long offset = 0, int size = 1, string order= "entry_asc", string lang = "zh_CN")
        {
            var path = string.Format("https://oapi.dingtalk.com/user/list?access_token={0}&department_id={1}&offset={2}&size={3}&order={4}&lang={5}", access_token, department_id, offset, size, order, lang);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<departmentmemberlists>(resultJson);
        }

        /// <summary>
        /// 获取管理员列表
        /// </summary>
        /// <param name="access_token"></param>
        /// <returns></returns>
        public static administrator Getadministratorlist(string access_token)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/get_admin?access_token={0}", access_token);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<administrator>(resultJson);
        }

        /// <summary>
        /// 根据unionid获取成员的userid
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="unionid">用户在当前钉钉开放平台账号范围内的唯一标识，同一个钉钉开放平台账号可以包含多个开放应用，同时也包含ISV的套件应用及企业应用</param>
        /// <returns></returns>
        public static useridtounionid Getuseridbyunionid(string access_token, string unionid)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/getUseridByUnionid?access_token={0}&unionid={1}", access_token, unionid);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<useridtounionid>(resultJson);
        }

        /// <summary>
        /// 获取企业员工人数
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="onlyActive">0:非激活人员数量，1:已经激活人员数量</param>
        /// <returns></returns>
        public static usernumber Getusernumber(string access_token, int onlyActive)
        {
            var path = string.Format("https://oapi.dingtalk.com/user/get_org_user_count?access_token={0}&onlyActive={1}", access_token, onlyActive);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<usernumber>(resultJson);
        }

        public static ResultPackage Register_Call_Back(string access_token,string reqJson)
        {
            var path = string.Format("https://oapi.dingtalk.com/call_back/register_call_back?access_token={0}", access_token);
            string resultJson = RequestHelper.Post(path, reqJson);
            return JsonHelpers.ToEntity<ResultPackage>(resultJson);
        }
    }

    #region 人员信息

    public class user : ResultPackage
    {
        /// <summary>
        /// 员工在企业内的UserI
        /// </summary>
        public string userid
        {
            get;set;
        }
        /// <summary>
        /// 手机设备号,由钉钉在安装时随机产生
        /// </summary>
        public string deviceId
        {
            get;set;
        }
        /// <summary>
        /// 是否是管理员
        /// </summary>
        public bool is_sys
        {
            get;set;
        }
        /// <summary>
        /// 级别，0：非管理员 1：超级管理员（主管理员） 2：普通管理员（子管理员） 100：老板
        /// </summary>
        public string sys_level
        {
            get;set;
        }
    }
        /// <summary>
        /// 人员基本信息
        /// </summary>
        public class userInfo : ResultPackage
    {
        /// <summary>
        /// 员工唯一标识ID
        /// </summary>
        public string userid
        {
            get;
            set;
        }
        /// <summary>
        /// 成员名称
        /// </summary>
        public string name
        {
            get;
            set;
        }
        /// <summary>
        /// 分机号（仅限企业调用）
        /// </summary>
        public string tel
        {
            get;
            set;
        }
        /// <summary>
        /// 办公地点（ISV不可见）
        /// </summary>
        public string workPlace
        {
            get;
            set;
        }
        /// <summary>
        /// 备注（ISV不可见）
        /// </summary>
        public string remark
        {
            get;
            set;
        }
        /// <summary>
        /// 手机号码（ISV不可见）
        /// </summary>
        public string mobile
        {
            get;
            set;
        }
        /// <summary>
        /// 员工的电子邮箱（ISV不可见）
        /// </summary>
        public string email
        {
            get;
            set;
        }
        /// <summary>
        /// 员工的企业邮箱（ISV不可见）
        /// </summary>
        public string orgEmail
        {
            get;
            set;
        }
        /// <summary>
        ///是否已经激活, true表示已激活, false表示未激活
        /// </summary>
        public bool active
        {
            get;
            set;
        }
        /// <summary>
        /// 在对应的部门中的排序, Map结构的json字符串, key是部门的Id, value是人员在这个部门的排序值
        /// </summary>
        public string orderInDepts
        {
            get;
            set;
        }
        /// <summary>
        /// 是否为企业的管理员, true表示是, false表示不是
        /// </summary>
        public bool isAdmin
        {
            get;
            set;
        }
        /// <summary>
        /// 是否为企业的老板, true表示是, false表示不是
        /// </summary>
        public bool isBoss
        {
            get;
            set;
        }
        /// <summary>
        /// 钉钉Id,在钉钉全局范围内标识用户的身份
        /// </summary>
        public string dingId
        {
            get;
            set;
        }
        /// <summary>
        /// 在当前isv全局范围内唯一标识一个用户的身份,用户无法修改
        /// </summary>
        public string unionid
        {
            get;
            set;
        }
        /// <summary>
        /// 在对应的部门中是否为主管, Map结构的json字符串, key是部门的Id, value是人员在这个部门中是否为主管, true表示是, false表示不是
        /// </summary>
        public string isLeaderInDepts
        {
            get;
            set;
        }
        /// <summary>
        /// 是否号码隐藏, true表示隐藏, false表示不隐藏
        /// </summary>
        public bool isHide
        {
            get;
            set;
        }
        /// <summary>
        /// 成员所属部门id列表
        /// </summary>
        public int[] department
        {
            get;
            set;
        }
        /// <summary>
        /// 职位信息
        /// </summary>
        public string position
        {
            get;
            set;
        }
        /// <summary>
        /// 头像
        /// </summary>
        public string avatar
        {
            get;
            set;
        }
        /// <summary>
        /// 员工工号
        /// </summary>
        public string jobnumber
        {
            get;
            set;
        }
        /// <summary>
        /// 扩展字段
        /// </summary>
        public object extattr
        {
            get;set;
        }
        /// <summary>
        /// 角色信息（ISV不可见），json数组格式
        /// </summary>
        public List<role> roles
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 人员角色
    /// </summary>
    public class role
    {
        /// <summary>
        /// 角色id
        /// </summary>
        public int id
        {
            get;set;
        }
        /// <summary>
        /// 角色名称
        /// </summary>
        public string name
        {
            get; set;
        }
        /// <summary>
        /// 角色分组名称
        /// </summary>
        public string groupName
        {
            get;set;
        }
    }

    /// <summary>
    /// 创建成员的结构体
    /// </summary>
    public class creatememberstructural
    {
        /// <summary>
        ///员工唯一标识ID
        /// </summary>
        public string userid
        {
            get;
            set;
        }
        /// <summary>
        /// 成员名称。长度为1~64个字符
        /// </summary>
        public string name
        {
            get;
            set;
        }
        /// <summary>
        /// 在对应的部门中的排序, Map结构的json字符串, key是部门的Id, value是人员在这个部门的排序值
        /// </summary>
        public string orderInDepts
        {
            get;
            set;
        }
        /// <summary>
        /// 成员所属部门id列表
        /// </summary>
        public int[] department
        {
            get;
            set;
        }
        /// <summary>
        /// 职位信息。长度为0~64个字符
        /// </summary>
        public string position
        {
            get;
            set;
        }
        /// <summary>
        /// 手机号码，企业内必须唯一
        /// </summary>
        public string mobile
        {
            get;
            set;
        }
        /// <summary>
        /// 分机号，长度为0~50个字符，企业内必须唯一不能重复
        /// </summary>
        public string tel
        {
            get;
            set;
        }
        /// <summary>
        /// 办公地点，长度为0~50个字符
        /// </summary>
        public string workPlace
        {
            get;
            set;
        }
        /// <summary>
        /// 备注，长度为0~1000个字符
        /// </summary>
        public string remark
        {
            get;
            set;
        }
        /// <summary>
        /// 邮箱。长度为0~64个字符。企业内必须唯一
        /// </summary>
        public string email
        {
            get;
            set;
        }
        /// <summary>
        /// 员工工号。对应显示到OA后台和客户端个人资料的工号栏目。长度为0~64个字符
        /// </summary>
        public string jobnumber
        {
            get;
            set;
        }
        /// <summary>
        /// 是否号码隐藏, true表示隐藏, false表示不隐藏。隐藏手机号后，手机号在个人资料页隐藏，但仍可对其发DING、发起钉钉免费商务电话。
        /// </summary>
        public bool isHide
        {
            get;
            set;
        }
        /// <summary>
        /// 是否高管模式，true表示是，false表示不是。开启后，手机号码对所有员工隐藏。普通员工无法对其发DING、发起钉钉免费商务电话。高管之间不受影响。
        /// </summary>
        public bool isSenior
        {
            get;
            set;
        }
        /// <summary>
        /// 扩展属性
        /// </summary>
        public object extattr
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 创建成员
    /// </summary>
    public class createmember : ResultPackage
    {
        /// <summary>
        ///员工唯一标识ID
        /// </summary>
        public string userid
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 更新成员的结构体
    /// </summary>
    public class updatememberstructural
    {
        /// <summary>
        ///员工唯一标识ID
        /// </summary>
        public string userid
        {
            get;
            set;
        }
        /// <summary>
        /// 成员名称。长度为1~64个字符
        /// </summary>
        public string name
        {
            get;
            set;
        }
        /// <summary>
        /// 成员所属部门id列表
        /// </summary>
        public int[] department
        {
            get;
            set;
        }
        /// <summary>
        /// 在对应的部门中的排序, Map结构的json字符串, key是部门的Id, value是人员在这个部门的排序值
        /// </summary>
        public string orderInDepts
        {
            get;
            set;
        }
        /// <summary>
        /// 职位信息。长度为0~64个字符
        /// </summary>
        public string position
        {
            get;
            set;
        }
        /// <summary>
        /// 手机号码，企业内必须唯一
        /// </summary>
        public string mobile
        {
            get;
            set;
        }
        /// <summary>
        /// 分机号，长度为0~50个字符，企业内必须唯一不能重复
        /// </summary>
        public string tel
        {
            get;
            set;
        }
        /// <summary>
        /// 办公地点，长度为0~50个字符
        /// </summary>
        public string workPlace
        {
            get;
            set;
        }
        /// <summary>
        /// 备注，长度为0~1000个字符
        /// </summary>
        public string remark
        {
            get;
            set;
        }
        /// <summary>
        /// 邮箱。长度为0~64个字符。企业内必须唯一
        /// </summary>
        public string email
        {
            get;
            set;
        }
        /// <summary>
        /// 员工工号。对应显示到OA后台和客户端个人资料的工号栏目。长度为0~64个字符
        /// </summary>
        public string jobnumber
        {
            get;
            set;
        }
        /// <summary>
        /// 是否号码隐藏, true表示隐藏, false表示不隐藏。隐藏手机号后，手机号在个人资料页隐藏，但仍可对其发DING、发起钉钉免费商务电话。
        /// </summary>
        public bool isHide
        {
            get;
            set;
        }
        /// <summary>
        /// 是否高管模式，true表示是，false表示不是。开启后，手机号码对所有员工隐藏。普通员工无法对其发DING、发起钉钉免费商务电话。高管之间不受影响。
        /// </summary>
        public bool isSenior
        {
            get;
            set;
        }
        /// <summary>
        /// 扩展属性
        /// </summary>
        public object extattr
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 批量删除的结构体
    /// </summary>
    public class batchdeletionstructural
    {
        /// <summary>
        ///员工UserID列表。列表长度在1到20之间
        /// </summary>
        public string[] useridlist
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 获取部门成员
    /// </summary>
    public class departmentmember : ResultPackage
    {
        /// <summary>
        ///在分页查询时返回，代表是否还有下一页更多数据
        /// </summary>
        public bool hasMore
        {
            get;
            set;
        }
        /// <summary>
        /// 成员列表
        /// </summary>
        public List<departmentmemberlist> userlist
        {
            get; set;
        }
    }

    /// <summary>
    /// 获取部门成员列表
    /// </summary>
    public class departmentmemberlist
    {
        /// <summary>
        ///员工唯一标识ID（不可修改）
        /// </summary>
        public string userid
        {
            get;
            set;
        }
        /// <summary>
        /// 成员名称
        /// </summary>
        public string name
        {
            get; set;
        }
    }

    /// <summary>
    /// 获取部门成员（详情）
    /// </summary>
    public class departmentmemberlists : ResultPackage
    {
        /// <summary>
        ///在分页查询时返回，代表是否还有下一页更多数据
        /// </summary>
        public bool hasMore
        {
            get;
            set;
        }
        /// <summary>
        /// 成员列表
        /// </summary>
        public List<departmentmemberuserlists> userlist
        {
            get; set;
        }
    }

    /// <summary>
    /// 获取部门成员（详情）成员列表
    /// </summary>
    public class departmentmemberuserlists
    {
        /// <summary>
        ///	员工唯一标识ID（不可修改）
        /// </summary>
        public string userid
        {
            get;
            set;
        }
        /// <summary>
        ///钉钉ID（不可修改）
        /// </summary>
        public string dingId
        {
            get;
            set;
        }
        /// <summary>
        ///手机号（ISV不可见）
        /// </summary>
        public string mobile
        {
            get;
            set;
        }
        ///// <summary>
        /////分机号（ISV不可见）
        ///// </summary>
        //public string tel
        //{
        //    get;
        //    set;
        //}
        ///// <summary>
        /////办公地点（ISV不可见）
        ///// </summary>
        //public string workPlace
        //{
        //    get;
        //    set;
        //}
        ///// <summary>
        /////备注（ISV不可见）
        ///// </summary>
        //public string remark
        //{
        //    get;
        //    set;
        //}
        /// <summary>
        ///表示人员在此部门中的排序，列表是按order的倒序排列输出的，即从大到小排列输出的（OA后台里面调整了顺序的话order才有值）
        /// </summary>
        public string order
        {
            get;
            set;
        }
        /// <summary>
        ///是否是企业的管理员, true表示是, false表示不是
        /// </summary>
        public bool isAdmin
        {
            get;
            set;
        }
        /// <summary>
        ///是否为企业的老板, true表示是, false表示不是 （不能通过接口设置,可以通过OA后台设置）
        /// </summary>
        public bool isBoss
        {
            get;
            set;
        }
        /// <summary>
        ///是否隐藏号码, true表示是, false表示不是
        /// </summary>
        public bool isHide
        {
            get;
            set;
        }
        /// <summary>
        ///是否是部门的主管, true表示是, false表示不是
        /// </summary>
        public bool isLeader
        {
            get;
            set;
        }
        /// <summary>
        ///成员名称
        /// </summary>
        public string name
        {
            get;
            set;
        }
        /// <summary>
        ///表示该用户是否激活了钉钉
        /// </summary>
        public bool active
        {
            get;
            set;
        }
        /// <summary>
        /// 成员所属部门id列表
        /// </summary>
        public int[] department
        {
            get;
            set;
        }
        /// <summary>
        /// 职位信息
        /// </summary>
        public string position
        {
            get;
            set;
        }
        /// <summary>
        /// 员工的邮箱
        /// </summary>
        public string email
        {
            get;
            set;
        }
        /// <summary>
        /// 员工的企业邮箱
        /// </summary>
        public string orgEmail
        {
            get;
            set;
        }
        /// <summary>
        /// 头像
        /// </summary>
        public string avatar
        {
            get;
            set;
        }
        /// <summary>
        /// 员工工号
        /// </summary>
        public string jobnumber
        {
            get;
            set;
        }
        /// <summary>
        /// 扩展属性
        /// </summary>
        public object extattr
        {
            get;
            set;
        }
        public string unionid
        {
            get;
            set;
        }
        public string openId
        {
            get;
            set;
        }
        public DateTime hiredDate
        {
            get;set;
        }
        public string remark
        {
            get;set;
        }
        public string tel
        {
            get;set;
        }
        public string workPlace
        {
            get;set;
        }
    }

    /// <summary>
    /// 获取管理员列表
    /// </summary>
    public class administrator : ResultPackage
    {
        /// <summary>
        /// 管理员角色列表
        /// </summary>
        public List<administratorrole> adminList
        {
            get; set;
        }
    }

    /// <summary>
    /// 获取管理员角色列表
    /// </summary>
    public class administratorrole
    {
        /// <summary>
        /// 管理员角色 1:主管理员,2:子管理员
        /// </summary>
        public string sys_level
        {
            get;
            set;
        }
        /// <summary>
        /// 管理员userid
        /// </summary>
        public string userid
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 根据unionid获取成员的userid
    /// </summary>
    public class useridtounionid : ResultPackage
    {
        /// <summary>
        /// 员工唯一标识ID（不可修改）
        /// </summary>
        public string userid
        {
            get; set;
        }
    }

    /// <summary>
    /// 企业员工人数
    /// </summary>
    public class usernumber : ResultPackage
    {
        /// <summary>
        /// 企业员工数量
        /// </summary>
        public int count
        {
            get; set;
        }
    }

    #endregion
}
